<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>对象的操作</title>
</head>

<body>
  <script>
    // 1. 对象的创建
    let obj = {};
    // 2. 扩展对象的属性和方法
    obj.x = 12;
    obj.write = function () {
      console.log("writing");
    }

    // 3. 对象如何销毁：
    // obj = null; // 让变量不在引用对象

    // 4. js系统的垃圾回收机制：
    // 当一个变量不在引用对象时，对象如果不在被其他变量引用，就会被自动销毁。

    // 5. 删除对象的属性
    obj.write(); // 如果不注释掉obj = null,则 Cannot read properties of null (reading 'write')。

    // 删除对象的一个属性
    delete obj.write;

    // console.log(obj); //{x: 12}

    // 6. Object.getPrototypeOf()方法返回指定对象的原型对象(原型对象中所有的属性和方法)。
    // Object.create(target): 创建一个新对象，新对象的原型对象指向target目标对象。
    let a = Object.create({ name: 'kikty', age: 23, sex: 1 });
    // console.log(a);
    // console.log(Object.getPrototypeOf(a)); // {name: 'kikty', age: 23, sex: 1}
    // console.log(a.__proto__); //{name: 'kikty', age: 23, sex: 1}

    function Person() {
      this.name = "any"
    }

    let p = new Person();

    // 下面三行代码输出相同的原型对象
    // console.log(Object.getPrototypeOf(p));
    // console.log(Person.prototype);
    // console.log(p.__proto__);

    // 7.  instanceof 运算符：用于检测构造函数的prototype属性所指向的原型对象是否出现在某个实例化对象的原型链上。
    /* 
        console.log(p instanceof Person); //true
    
        function Student() {
          this.sid = 1;
        }
    
        console.log(p instanceof Student); //false
    
        let arr = [] // new Array()
        console.log(arr instanceof Array); // true
    
        let arr2 = new Array()
        console.log(arr2 instanceof Array); // true
    
        console.log(p instanceof Object);// true
        console.log(arr2 instanceof Object);// true
        console.log({} instanceof Object); // true
        console.log("ab" instanceof Object);  // false "ab"是一个字面量的值，不是对象
    
        console.log(new String("hhh") instanceof Object); // true
     */
    // 8. 对象名.hasOwnProperty(属性名)：判断一个属性是否是对象自己拥有的属性。
    let b = Object.create({ name: 'kikty', age: 23, sex: 1 });

    b.height = 180;
    b.money = 100324234;
    console.log(b.name); // kikty

    console.log(b.hasOwnProperty('name')); //false
    console.log(b.hasOwnProperty('age'));  //false 
    console.log(b.hasOwnProperty('sex'));  //false
    console.log(b);

    console.log(b.hasOwnProperty('height'));  // true
    console.log(b.hasOwnProperty('money')); // true

    // 下面三个方法,主要是需要把对象,转变为数组时使用.

    // 9. Object.keys(); 返回对象自己的属性的集合,不找原型对象上属性!
    let keysArr = Object.keys(b);
    console.log(keysArr);//['height', 'money']
    // Object.values(); 返回对象自己的属性的值集合,不找原型对象上属性!
    let valuesArr = Object.values(b)
    console.log(valuesArr); // [180, 100324234]
    // Object.entries():返回一个给定对象自身可枚举属性的键值对数组，其排列与使用 for...in 循环遍历该对象时返回的顺序一致（区别在于 for-in 循环还会枚举原型链中的属性）。不找原型对象上属性!

    let allArr = Object.entries(b);
    console.log(allArr); // [['height', 180],['money', 100324234]]
    //  allArr[0] = ['height', 180]
    // allArr[1] = ['money', 100324234]

    for (let i = 0; i < allArr.length; i++) {
      let el = allArr[i]
      for (let j = 0; j < el.length; j++) {
        console.log(el[j]);
      }
    }

  </script>
</body>

</html>